Welcome to pandas!

4.6 拆分为表列

1、拆分列

被处理的数据类型必须是字符串类型,结构为s.srt函数,如果Series的数据类型不是文本字符类型,则需要转换。

s.str.split(pat=none,n=-1,expand=”true”)

pat :可先参数,拆分时的分隔符,可以是普通字符或正则表达式,如果未指定,则按空格拆分。

n :可选参数,设置拆分次数,none,-1,0都表示全部拆分。

expand :可选参数,是否将拆分的字符串展开为单独的列,如果为True,则返因DataFrame表格,如果为False,则返回为含字符串的列表Series数据,默为False


import pandas as pd

s=pd.Series([ "lucas-95-34","lily-23","Bob-76-35" ])

t1=s.str.split( "-" )

t2=s.str.split( "-" , expand = True )

print (t1)

print (t2)

返回:

0 [lucas, 95, 34]
1 [lily, 23]
2 [Bob, 76, 35]

dtype: object


0 1 2
0 lucas 95 34
1 lily 23 None
2 Bob 76 35

import pandas as pd

s=pd.Series([ "lucas95","lily23","Bob35" ])

t1=s.str.split( "(?<=\D)(?=\d)" , expand = True )

t2=s.str.split( "(?<=\D)(?=\d)" )

print (t1)

print (t2)

返回:

0 1
0 lucas 95
1 lily 23
2 Bob 35

0 [lucas, 95]
1 [lily, 23]
2 [Bob, 35]

dtype: object


2、拆分应用(将列的数据拆分并求和)

import pandas as pd ,numpy as np

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.拆分后求和.xlsx" )

print (df)

df[ "总分" ]=df.分数.str.split( "、" ).apply( lambda l :sum(np.array( l , dtype = "int" )))

print (df)

返回:

部门 分数
0 销售部 88、78、65
1 财务部 98、54、67、44
2 IT部 99、73

部门 分数 总分
0 销售部 88、78、65 231
1 财务部 98、54、67、44 263
2 IT部 99、73 172

3、提取(向列方向扩展)

在pandas中,如果需要执行数据的提取,则使用s.str.extract()函数。

s.srt.extract(pat,flags=0,expand=True)

pat :分组的正则表达式模式,如果命名分组,则是列名

flags :re模块中的标志

expand :如果为True,则返回DataFrame,如果为False,只有1个分组返回Series,有多个分组则返回DataFrame


import pandas as pd

s=pd.Series([ "张三100","lucass78","Bob78" ])

t=s.str.extract( "(?P<:姓名>:\D+)(?P<:分数>:\d+)" )

print (t)

返回:

姓名 分数
0 张三 100
1 lucass 78
2 Bob 78

4、提取(向行方向扩展)

可以用extractal()函数扩展为多行

import pandas as pd

s=pd.Series([ "张三100李四45","lucass78jim67","Bob78狗剩45" ])

df=s.str.extractall( "(?P<:姓名>:\D+)(?P<:分数>:\d+)" ).astype({ "分数":"int" })

t=df.分数.sum()

print (t)

print (df)

返回:

413

姓名 分数
match
0 0 张三 100
1 李四 45
1 0 lucass 78
1 jim 67
2 0 Bob 78
1 狗剩 45

5、提取(提取列的金额,姓名,分数)

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.提取金额、姓名.xlsx","采购" )

print (df)

df["金额"]=df.数据.str.extract( "(\d+)元" , expand = False )

print (df)

返回

产品 数据
0 茄子 10kg88元
1 牛肉 4100元(25kg)
2 鸡蛋 100枚99元
3 牛奶 5件400元

产品 数据 金额
0 茄子 10kg88元 88
1 牛肉 4100元(25kg) 4100
2 鸡蛋 100枚99元 99
3 牛奶 5件400元 400

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.提取金额、姓名.xlsx","名单" , index_col=0 )

print (df)

t=df.名单.str.extractall( "(?P<:姓名>:[一-龟]+)(?P<:分数>:\d+)" )

print (t)

返回:

名单
组别
A组 张三33分,李四99分
B组 小明56分,小灰灰95分,小杰93分
C组 大志若遇100分

姓名 分数
组别 match
A组 0 张三 33
1 李四 99
B组 0 小明 56
1 小灰灰 95
2 小杰 93
C组 0 大志若遇 100